#pragma once
#ifndef __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//#include <windows.h>
//#include <conio.h>
#include "interface.h"
#include <signal.h>
//#define NUM 20//用于控制信息总数。。排序
typedef struct user {
	char uname[20];
	char pass[20];
	int right;//1表示超级管理员；2表示普通管理员
	struct user* pnext;
}user,*puser;
typedef struct customer {
	int id;
	char name[20];//cname!
	int room_num;
	struct customer* pnext;
}customer, * pcustomer;
typedef struct room{
	int num;
	char level[10];//premium,common
	float price;
	int is_available;//0表示否，1表示是
	int cusomer_id;//用户id
	struct room* pnext;
}room,*proom;
typedef pcustomer elem_t;

void system_init(puser *ppuhead,puser*pputail,pcustomer *pphead,pcustomer*pptail);

int recordNum(char argv[][100],int flag);//arg本身是一个二级指针，所以直接传递arg即可！
//统计record条数的目的是为了排序,flag传递统计哪个文件的记录数
//1，用户记录；2，客户记录；3，客房记录

void input_password(char* str);
int repeatCheckU(puser puhead, char* uname);
//char uname!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int userInsert(puser* ppuhead, puser* pputail, char* uname, char* pass, int right);//插入失败返回-1，成功返回1
void printUser(puser puhead);
int login(puser puhead,char* uname, char* pass);//登录成功返回用户权限，失败返回-1
void deleteUser(puser* pphead, puser* pptail, char* str);


int repeatCheck(pcustomer phead, int id);//客户信息查重，重复返回1，否则返回-1
int tailInsert(pcustomer* pphead, pcustomer* pptail, int id, char* name, int room_num);//pphead为二级指针
void printList(pcustomer phead);//打印客户信息
int findId(pcustomer phead, int num);//查找客户信息
void modifyList(pcustomer phead, int id, int room_num);//修改客户信息
void deleteList(pcustomer* pphead, pcustomer* pptail, int id);//删除客户信息
//只要需要对链表中的数据进行修改，就需要用到二级指针？？为什么呢？？
//准确的说，不是对链表中数据的修改，而是对链表中指向结点的指针的值的修改操作
//要改变phead的值，并且phead为指针，故要传递&phead，函数形参为二级指针

int comparePointer(const void* left, const void* right);
void printsorted(pcustomer* parr, int len);

int repeatCheckR(proom phead, int num);

#endif
